import { computed, ComputedRef } from "vue";

/**
 * 带缓存的响应式计算属性；
 * 针对带参数(原computed计算属性是无参函数)、耗时操作；
 * @param fn 带参数的函数或耗时函数
 * @returns 响应式计算属性
 */
export function useComputed(fn: Function) {
  const cache = new Map<string, ComputedRef>();
  function getCache(args: any) {
    return cache.get(JSON.stringify(args));
  }
  return function (...args: any[]) {
    const cacheReslut = getCache(args);
    if (cacheReslut) {
      return cacheReslut;
    }
    const result = computed(() => fn(...args));
    cache.set(JSON.stringify(args), result);
    return result;
  };
}
